package xdu.lz.stage2_design_pattern.chapter12_balking_pattern;

import java.io.FileWriter;
import java.io.IOException;


//例子：仅类似“自动保存功能”，通过此模式，防止重复保存
public class BalkingData {

    private final String fileName;

    private String content;

    private boolean changed;

    public BalkingData(String fileName, String content) {
        this.fileName = fileName;
        this.content = content;
        this.changed = false;
    }

    //主动要求发生变化：注意这里每次change都要save一下，否则数据会被后change的冲刷
    public synchronized void change(String newContent) {
        this.content = newContent;
        this.changed = true;
    }

    //被动轮询检查是否发生变化
    public synchronized void save() throws IOException {
        System.out.println("save被调用了");
        //如果没有变化需求则返回:警戒条件，不同于guarded-suspension，后者会wait住
        if (!changed) {
            return;
        }
        //有变化需求则 服务
        doSave();
        //置标志位
        this.changed = false;

        //注意由于这里加了synchronized，所以不会出现doSave被重复执行
        //当已经被doSave后 ，下一个进来的changed会为false，不会在执行doSave
    }

    private void doSave() throws IOException {
        System.out.println(Thread.currentThread().getName()+" 要求变化 ，变化内容"+content);
        //输出字符流
        //writer实现了closeable接口，这样try会自动关闭资源
        try(FileWriter writer = new FileWriter(fileName,true)){
            writer.write(content+"\r\n");
            writer.flush();
        }
    }
}
